#pragma once

#include  "iostream"
#include  "vector"
#include  "stack"
#include  "unordered_map"
#include   "queue"

using namespace std;
/**
 *
  static bool cmp(const pair<int,int> &a, const pair<int,int> &b)
    {
        return a.second>b.second;
    }

  priority_queue<pair<int,int>, vector<pair<int,int>>, decltype(&cmp)> q(cmp);
 *
 *
大家对这个比较运算在建堆时是如何应用的，为什么左大于右就会建立小顶堆，反而建立大顶堆比较困惑。
确实 例如我们在写快排的cmp函数的时候，return left>right 就是从大到小，return left<right 就是从小到大。
优先级队列的定义正好反过来了，可能和优先级队列的源码实现有关（我没有仔细研究），我估计是底层实现上优先队列队首指向后面，队尾指向最前面的缘故！
 *
 * */
//重写放函数

struct cmp {
    bool operator()(const pair<int, int> &a, const pair<int, int> &b) {
        return a.second < b.second;
    }
    //从大到小排序
};


vector<int> topKFrequent(vector<int> &nums, int k) {
    vector<int> res;
    unordered_map<int, int> mp;
    priority_queue<pair<int, int>, vector<pair<int, int>>, cmp> q;

    for (const auto &item : nums) {
        ++mp[item];
    }

    for (const auto &item : mp) {
        q.push(make_pair(item.first, item.second));
    }

    for (int i = 0; i < k; ++i) {
        res.push_back(q.top().first);
        q.pop();
    }


    return res;
}